<?php

ob_start();

define('ROOT',dirname(__FILE__).'/');
require ROOT.'config.php';

/** 全局变量   */
// CMD 传递页面执行参数
define('CMD',empty($_GET['CMD']) ? (empty($_POST['CMD'])?'index':$_POST['CMD']) : $_GET['CMD']);

// 提交值的时候，指定METHOD=POST
define('METHOD',(kc_val($_POST,'METHOD')=='POST' ? 'POST' :'GET'));

// 是否ajax方式调用页面
define('AJAX',isset($_POST['AJAX']) ? true : false);

// UTCMS程序版本,必须为数字
define('VERSION',200);

define('LANGUAGE','zh-cn');

///**
// * 页面及参数处理
// */
if (get_magic_quotes_gpc()){
	$_GET=array_filter($_GET,'stripslashes_array');
	$_POST=array_filter($_POST,'stripslashes_array');
	$_COOKIE=array_filter($_COOKIE,'stripslashes_array');
}
//
// CALLFUNC[true] 若被定义，则不调用 CMD 指定的函数
if(!defined('CALLFUNC')){
	$func='_'.CMD;
	if (function_exists($func)) {
		call_user_func($func);;
	}else{
		//当定义了MODULE的时候才找model目录
		if (defined('MODULE')) {
			if (is_file(ROOT.MODULE.'/model/'.CMD.'.php')) {
				require ROOT.MODULE.'/model/'.CMD.'.php';
			}
		}
		
		kc_tip(kc_lang('error.not.func'));
	}
}
//
//set_error_handler('error_handler');


/**
 * 转义
 * @param string $arr 数组或变量
 * @return type
 */
function stripslashes_array(&$arr){
	$arr=is_array($arr)
	? array_map('stripslashes_array',$arr)
	: stripslashes($arr);
	return $arr;
}
/**
 * 自动加载类
 * @param string $clsname 类名称，类对应的文件名称必须用小写,带默认值是为避免出错
 */
function __autoload($clsname=null){

	//当$clsname为空值的时候，应该是global.php?CMD=_autoload方式进行的调用
	if(empty($clsname)) exit(kc_tip(kc_lang('error.autoload')));

	$fpath=ROOT."library/{$clsname}.class.php";
	if(file_exists($fpath)){
		require($fpath);
	}else{
		kc_tip(kc_lang('error.not.file',array('classname'=>"include/lib/$clsname.class.php")));
	}
}
/**
 * 错误提示
 *. @param integer$type 错误类型
 * @param string $msg 内容
 * @param string $file 发生文件
 *. @param integer$line 行数
 */
function error_handler($type,$msg,$file,$line){
	echo "\n\n<h2>$msg</h2>\n<p>$file - <strong>$line</strong></p>\n\n";
}

/**
 * 输出json格式的ajax请求
 * @param type $array php数组
 */
function kc_ajax($array){
	if (empty($array)) exit('');

	if (isset($array['TITLE']) && isset($array['MAIN']) ) {
		if (empty($array['WIDTH']))
			$array['WIDTH']=320;
		if (empty($array['HEIGHT']))
			$array['HEIGHT']=100;
		if (empty($array['BUTTON'])) {
			$array['BUTTON']='<button onclick="$.kc_close()">'.kc_lang('common.enter').'</button>';
		}
	}
	exit(kc_jsonEncode($array));
}
/**
 * 获得配置参数
 * 
 * @param string $className 配置参数，句号分开,无句号的时候，返回类数组
 * @return string|array
 */
function kc_config($className){
	if (false === strpos($className,'.')) {//若没有的时候
		$class=$className;
	}else{
		list($class,$name)=explode('.',$className);
		$name=strtolower($name);
	}

	$global_class='kc_config_'.$class;
	if (empty($GLOBALS[$global_class])) {
		$db= new db;
		$class=$db->encode($class);
		$res=$db->getRows('%s_config','name,value',"class='$class'");
		$config=array();
		if ($res) {
			foreach ($res as $rs) {
				$config[strtolower($rs['name'])]=$rs['value'];
			}
		}
		$GLOBALS[$global_class]=$config;
		unset($config);
	}

	if (empty($name)) {
		if (isset($GLOBALS[$global_class])) {
			return $GLOBALS[$global_class];
		}else{
			kc_tip(kc_lang('error.config',array('classname'=>$className)));
		}
	}else{
		if (isset($GLOBALS[$global_class][$name])) {
			return $GLOBALS[$global_class][$name];
		}else{
			kc_tip(kc_lang('error.config',array('classname'=>$className)));
		}
	}
}
/**
 * 当页面出现错误的时候调用
 * @param type $s 错误提示标题
 * @param string $type 提示类型
 * @param string $but 按钮
 *		enter 点击“确定”关闭
 *		close “关闭”
 *		refresh 刷新当前页
 */
function kc_tip($str,$type='error',$but=null){

	//ajax页面的时候提示错误
	if (AJAX) {
		$main="<table cellspacing=\"0\" class=\"k_tip\">
			<tr>
				<th><img src=\"images/confirm_".$type.".gif\"/></th>
				<td>$str</td>
			</tr>
		</table>";

		$array=array(
			'TITLE'=>kc_lang('tip.'.$type),
			'MAIN'=>$main,
			'ID'=>'k_ajax',
			'WIDTH'=>400,
			'HEIGHT'=>100,
		);
		//if($but!='') $array['BUTTON']=$but;

		if(!empty($but)){
			if (is_array($but)) {
				$s='';
				foreach ($but as $key => $val) {
					$s.="<button onclick=\"go('".addslashes($val)."')\">".addslashes($key)."</button>";
				}
				$but=$s;
			}elseif($but=='enter'){//确定关闭
				$but="<button onclick=\"\$.kc_close()\">".kc_lang('enter')."</button>";
			}elseif($but=='close'){//关闭提示
				$but="<button onclick=\"\$.kc_close()\">".kc_lang('close')."</button>";
			}elseif($but=='refresh'){//刷新来源页
				$but="<button onclick=\"go('".(empty($_POST['HTTP_REFERER'])?'./':$_POST['HTTP_REFERER'])."');$.kc_close();\">".kc_lang('enter')."</button>";
			}
			$array['BUTTON']=$but;
		}

		kc_ajax($array);
	}else{
		extract(user::init());
		$title='错误提示';
		$s='<p class="k_err">'.$str.'</p>';
		$s.='<p><a href="./">返回首页</a></p>';
		require ROOT.TEMPLATE;
			require ROOT.TEMPLATE;
		exit();
		$url=basename(dirname($_SERVER['REQUEST_URI']));

		$assign=array(
			'title'=>kc_lang('error.title'),
			'content'=>$str,
		);

	$tmp= new template;
		$tmp->assign=$assign;
		$tmp->path=($url==PATH_ADMIN ? PATH_ADMIN.'/template' : PATH_TEMPLATE);
		$tmp->load_file='error.php';
		$s=$tmp->output();

	}
	exit($s);
}
/**
 * 数组中获得值
 * @param array $array 有值的数组
 * @param string $val 键值
 * @param string $def 如果数组中没有键值的时候，返回这个值
 * @return string
 */
function kc_val($array,$val,$def=''){
	return isset($array[$val]) ? $array[$val] : $def;
}
/**
 * 获取HTTP POST方式传递值
 * @param string $name 要获取POST变量
 * @param integer $type 数据类型验证，详情请见kc_validate()
 * @param bool $is true的时候，必须有值
 * @return string
 */
function kc_post($name,$type=0,$is=0){

	$post = isset($_POST[$name]) ? $_POST[$name] : false;
	if(!empty($post)){//如果有值，则判断类型
		if(!kc_validate($post,$type)){
			kc_tip(kc_lang('form.validate.post',array('key'=>$name,'value'=>$post)));
		}
	}

	if($is && $post===false){//要求有值的时候判断
		kc_tip(kc_lang('form.validate.post',array('key'=>$name)));
	}

	return $post;
}
/**
 * 获取HTTP GET传递值
 * @param string $name 要获取的URL变量
 * @param integer $type 数据类型验证，详情请见kc_validate()
 * @param bool $is true的时候，必须有值
 * @return string
 */
function kc_get($name,$type=2,$is=0){

	$get = isset($_GET[$name]) ? $_GET[$name] : false;
	//若GET为空，则POST方式获取值
	if (AJAX==1 && $get===false) {
		$get = isset($_POST[$name]) ? $_POST[$name] : false;
	}
	if(!empty($get)){//如果有值，则判断类型
		if(!kc_validate($get,$type)){
			kc_tip(kc_lang('form.validate.get',array('key'=>$name,'value'=>$get)));
		}
	}
	if($is && $get===false){//要求有值的时候判断
		kc_tip(kc_lang('error.not.get',array('key'=>$name)));
	}

	return $get;
}
/**
 * 获得list复选框列表值
 * @param bool $is 验证是否为必须选择复选框 1必选 0可以不选
 * @param <int||string> $type 数据类型验证,详见kc_validate()
 * @return string
 */
function kc_getList($is=1,$type=3){

	$list=kc_post('list');
	if($is && !($list)){
		kc_tip(kc_lang('error.not.list'));
	}
	if(!kc_validate($list,$type)){
		kc_top(kc_lang('error.type'));
	}
	return $list;
}

/**
 * 读取Cookie
 * @param type $name COOKIE键值
 * @return string
 */
function kc_cookie($name){

	return empty($_COOKIE[$name]) ? '' : $_COOKIE[$name];
}
/**
 * 设置Cookie
 * @param string $name 键值
 * @param string $val 对应的值
 *. @param integer$expire Cookie有效期
 */
 function kc_setCookie($name,$val,$expire = 0) {
 
	setcookie($name, $val,$expire ? time() + $expire : 0, '/browse/');
}


/**
 * 编码转换
 * @param string $s   录入的
 * @param string $out 输出编码类型
 * @param string $in  输入编码类型
 * @return string
*/
function kc_iconv($s,$out='UTF-8',$in='GBK'){
	if($out==$in)
		return $s;
	if(function_exists('iconv')){
		$s=iconv($in,"$out//IGNORE",$s);
	}elseif(function_exists('mb_convert_encoding')){
		$s=mb_convert_encoding($s,$out,$in);
	}
	return $s;
}
/**
 * 字符串类型验证
 * @param string $s 要验证的字符串数据
 * @param <int|string|array> $type 数据类型，当为数组类型的时候，判断是否包含其值中
 * 0 : 任意字符
 * 1 : 数字和字母
 * 2 : 数字,无符号
 * 3 : 数字组合，逗号分开
 * 4 : 数字字母和下划线，中划线会有问题
 * 5 : 邮箱验证
 * 6 : 网址
 * 7 : 完整http图片地址 + 本地
 * 8 : 日期+时间 类型
 * 9 : 日期 类型
 * 10: 版本号 1.0.23
 * 11: IP地址
 * 12: 常数 1.001
 * 13: 数字、字符组合，逗号分开
 * 13: 颜色值
 * 22: 数字,有符号
 * 23: 第一个字符是字母,后面的由数字、字母和下划线构成
 * 24: 数字、字母和中下划线,用在目录验证
 * 25: base64_encode转换后的数据
 * 带符号的数字组合,逗号分开
 * 33: 带符号的数字组合,逗号分开
 * 34: 不匹配特殊符号，帐户验证的时候用
 * default: 自定义正则验证
 * @return bool 验证通过返回1，否则false
*/
function kc_validate($s,$type){
	$reg='';
	switch($type){
		case 1:$reg='/^[a-zA-Z0-9]+$/';break;
		case 2:$reg='/^[0-9]+$/';break;
		case 3:$reg='/^([0-9]+,)*[0-9]+$/';break;
		case 4:$reg='/^[A-Za-z0-9\_]+$/';break;
		case 5:
			$reg='/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/';break;
		case 6:
			$reg='/^[a-zA-Z]{3,10}:\/\/[^\s]+$/';
			break;
		case 7:
			$reg='/^([a-zA-Z]{3,10}:\/\/)?[^\s]+\.(jpeg|jpg|gif|png|bmp)$/';
			break;
		case 8:
			$reg='/^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29)) (20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d$/';
			break;
		case 9:
			$reg='/^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29))$/';
			break;
		case 10:$reg='/^\d?\.\d?\.\d{4}$/';break;
		case 11:$reg='/^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/';break;
		case 12:$reg='/^(\d+(\.\d+)?)$/';break;
		case 13:$reg='/^([0-9A-Za-z]+,)*[0-9A-Za-z]+$/';break;
		case 13:$reg='/^#?[0-9A-Fa-f]{6}$/';break;
		case 17:$reg='/^([a-zA-Z]{3,10}:\/\/)[^\s]+$/';break;
		case 22:$reg='/^(\-|\+)?[0-9]+$/';break;
		case 23:$reg='/^[a-zA-Z][a-zA-Z0-9\_]*/';break;
		case 24:$reg='/^([a-zA-Z0-9\-_]+\/)+$/';break;
		case 25:$reg='/[a-zA-Z0-9\+\%]+(\=)*$/';break;
		case 33:$reg='/^(\-?[0-9]+\,?)+$/';break;
		case 34:$reg="/^[^\s!-\/:-@\[-`\{-~]+$/";break;
		default:$reg=$type;break;
	}

	//如果为数组类型
	if (is_array($reg)) {
		$bool=in_array($s,$reg);
	}else{
		$bool= empty($type)
			? true
			: (empty($reg) ? false : (bool)preg_match($reg,$s));
	}

	return $bool;
}
/**
 * 调用语言,不考虑模块类型，模块若有语言包，则安装到include/language里
 *
 * 可以用$lang='kc_language';$lang($path)方式简化这个函数的调用
 *
 * @param string $path 路径
 * @param array $replace 值替换
 * @param string $language 语言类型,若不指定则从cookie中获取
 * @return string 对应的语言包或语言包文件里的数组对象
 */
function kc_lang($path,$replace=null,$language=null){

	if (strpos($path,'.')==false) {
		$p=array('common',$path);
	}else{
		$p=explode('.',$path);
	}

	$c=count($p);

	if ($c>1) {

		//获得第一个对象，从中获取对应的语言包文件
		$pre=$p[0];
		//设置为全局变量
		$global_path="kc_language_$pre";
		if (empty($GLOBALS[$global_path])) {
			$filepath=ROOT.'language/'.$pre.'.lang.php';
			if (is_file($filepath)) {
				$GLOBALS[$global_path]=require($filepath);
			}else{
				return "[!$path]";
			}
		}

		$gp=$GLOBALS[$global_path];
		for ($i=1;$i<$c;$i++) {
			if (empty($gp[$p[$i]])) {
				return "[!$path]";
			}else{
				$gp=$gp[$p[$i]];
			}
		}
		if (is_array($replace)) {
			//替换
			foreach ($replace as $key => $val) {
				$gp=str_replace('{'.$key.'/}',$val,$gp);
			}
		}
		return $gp;

	}else{
		return "[$path]";
	}

}
/**
 * json_encode
 * 
 * @param array $array 需要转换的数组
 * @return string JavaScript可读的json格式
 */
function kc_jsonEncode($array){
	//$array=array_filter($array);
	if(function_exists('json_encode')) return json_encode($array);//毕竟用自带的效率更高5.2开始支持

	if(!is_array($array)) return false;

	$keys=array_keys($array);
	$is_true=true;
	for($i=0;$i<count($keys);$i++){
		if($i!==$keys[$i]){
			$is_true=false;
			break;
		}
	}

	$arr='';
	foreach($array as $key => $val){
		if(is_array($val)){
			$temp=kc_jsonEncode($val);
			$arr[]=$is_true ? $temp : "\"$key\":$temp";
		}else{
			$val=str_replace(array("\n",chr(13)),array('\n',''),addslashes($val));
			$arr[]=$is_true ? "\"$val\"" : "\"$key\":\"$val\"";
		}
	}
	$s=implode(',',$arr);
	return $is_true ? "[$s]" : "{{$s}}";
}



/**
 * 编码转换
 * @param string $s   录入的
 * @param string $out 输出编码类型
 * @param string $in  输入编码类型
 * @return string
*/
function kc_userherd($uid='',$type='middle'){
		$var = "avatarfile_{$uid}_{$size}_{$type}";
		if(empty($_SGLOBAL[$var])) {
			$uid = abs(intval($uid));
			$uid = sprintf("%09d", $uid);
			$dir1 = substr($uid, 0, 3);
			$dir2 = substr($uid, 3, 2);
			$dir3 = substr($uid, 5, 2);

			$_SGLOBAL[$var] = '/browse/flash/upload/avatar/'.$dir1.'/'.$dir2.'/'.$dir3.'/'.substr($uid, -2).$typeadd."_avatar_".$type.".jpg";
		}
		return $_SGLOBAL[$var];
}


function kc_iamg_taobao($uid){
	return preg_replace('#http://img(.*).taobaocdn.com/bao/#Us','/browse/cont-bao/',$uid); 
}



?>